import path from 'path' // node
/**
 * 过滤脱离层级路由, 仅保留一级路由
 * @param {*} routes router.getRoutes()
 */
export const filterRouters = routes => {
  const childrenRoutes = getChildrenRoutes(routes)
  return routes.filter(route => {
    // 路由去重
    return !childrenRoutes.find(childrenRoute => {
      return childrenRoute.path === route.path
    })
  })
}
/**
 * 生成路由规则
 * @param {*} routes
 */
export function generateMenus(routes, basePath = '') {
  const result = []
  // 遍历路由表
  routes.forEach(item => {
    // 不存在children&&不存在meta
    if (isNull(item.meta) && isNull(item.children)) return
    // 存在children不存在meta，进入迭代
    if (isNull(item.meta) && !isNull(item.children)) {
      result.push(...generateMenus(item.children))
      return
    }
    // 不存在children存在meta(子级路由)
    // 合并path作为跳转路径
    const routePath = path.resolve(basePath, item.path)
    // 路由分离之后，存在同名父路由的情况，需要单独处理
    let route = result.find(item => item.path === routePath)
    if (!route) {
      route = {
        ...item,
        path: routePath,
        children: []
      }

      // icon 与 title 必须全部存在
      if (route.meta.title && route.meta.icon) {
        // meta 存在生成 route 对象，放入 arr
        result.push(route)
      }
    }

    // 存在 children 进入迭代到children
    if (item.children) {
      route.children.push(...generateMenus(item.children, route.path))
    }
  })
  return result
}
/**
 * path.resolve( [from…], to )方法将路径转成绝对路径，就是将参数 to 拼接成一个绝对路径，[from … ] 为选填项
 * 从后向前拼接路径；
 * 若 to 以 / 开头，不会拼接到前面的路径；
 * 若 to 以 ../ 开头，拼接前面的路径，且不含最后一节路径；
 * 若 to 以 ./ 开头或者没有符号，则拼接前面路径。
 */
function isNull(data) {
  if (!data) return true
  if (JSON.stringify(data) === '{}' || JSON.stringify(data) === '[]') return true
  return false
}
/**
 * 返回所有子路由
 */
const getChildrenRoutes = routes => {
  const result = []
  routes.forEach(route => {
    if (route.children && route.children.length > 0) {
      result.push(...route.children)
    }
  })
  return result
}
